home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MACD 5
/
MACD 5.bin
/
workbench
/
wb
/
czesc_2
/
fakedeficon
/
fakedeficon.e
< prev
next >
Wrap
Text File
|
1994-06-07
|
9KB
|
335 lines
/* FakeDefIcon.e -- a program to do what Icon should do... */
/* Copyright (c) 1994, Jason R. Hulance */
OPT OSVERSION=37
MODULE 'exec/ports', 'exec/tasks', 'exec/memory', 'exec/io', 'exec/lists',
'whatis', 'utility/tagitem', 'utility', 'intuition/intuition',
'icon', 'dos/dos', 'dos/dosextens', 'workbench/workbench'
CONST OFF_EXAM=$ff9a /* dosbase offset of Examine() */
CONST OFF_EXNEXT=$ff94 /* dosbase offset of ExNext() */
CONST OFF_OPEN=$ffe2 /* dosbase offset of Open() */
CONST OFF_OW=$fda2 /* intuitionbase offset of OpenWindowTagList() */
CONST OFF_ADDG=$fe4a /* intuitionbase offset of AddGList() */
/* WhatIs constants */
CONST CMP_EQUAL=0, TYPE_UNSCANNED=0, TYPE_UNKNOWNFILETYPE=$FFFE,
TYPE_UNKNOWNIDSTRING=$FFFFFFFF, LIGHTTYPE=0, DEEPTYPE=1,
WI_FIB=TAG_USER+202, WI_DEEP=TAG_USER+203
CONST NOT_FOUND=-1, QUOTE=34
ENUM NO_ERR, LIB_ERR, SETF_ERR, ARGS_ERR
/* Override the list node definition with a bigger one */
OBJECT ln
succ, pred
dum_type:CHAR, dum_pri:CHAR
name
type
ENDOBJECT
DEF namelist:lh, debug=0, fake, icontype, exetype, win=NIL:PTR TO window
RAISE LIB_ERR IF OpenLibrary()=NIL,
SETF_ERR IF SetFunction()=NIL,
ARGS_ERR IF ReadArgs()=NIL
PROC main() HANDLE
DEF old_exam=NIL, old_exnext=NIL, old_open=NIL, old_ow=NIL,
old_addg=NIL, rdargs=NIL, args:PTR TO LONG
args:=[0,0]
rdargs:=ReadArgs('NOFAKE/S,DEBUG/N', args, NIL)
fake:=Not(args[])
debug:=args[1]
IF debug
debug:=^debug
IF debug THEN WriteF('')
ENDIF
namelist.head:=namelist+4
namelist.tail:=NIL
namelist.tailpred:=namelist
whatisbase:=OpenLibrary('whatis.library', NIL)
exetype:=GetIDType('Exe')
icontype:=GetIDType('Icon')
utilitybase:=OpenLibrary('utility.library', 37)
iconbase:=OpenLibrary('icon.library', 37)
old_exam:=SetFunction(dosbase, OFF_EXAM, {new_exam})
PutLong({patch_exam}, old_exam)
IF fake
old_exnext:=SetFunction(dosbase, OFF_EXNEXT, {new_exnext})
PutLong({patch_exnext}, old_exnext)
old_open:=SetFunction(dosbase, OFF_OPEN, {new_open})
PutLong({patch_open}, old_open)
ENDIF
old_ow:=SetFunction(intuitionbase, OFF_OW, {new_ow})
PutLong({patch_ow}, old_ow)
old_addg:=SetFunction(intuitionbase, OFF_ADDG, {new_addg})
PutLong({patch_addg}, old_addg)
LEA store(PC), A0
MOVE.L A4, (A0) /* Store the A4 register... */
Wait(SIGBREAKF_CTRL_C)
Raise(NO_ERR)
EXCEPT
IF old_addg THEN SetFunction(intuitionbase, OFF_ADDG, old_addg)
IF old_ow THEN SetFunction(intuitionbase, OFF_OW, old_ow)
IF old_open THEN SetFunction(dosbase, OFF_OPEN, old_open)
IF old_exnext THEN SetFunction(dosbase, OFF_EXNEXT, old_exnext)
IF old_exam THEN SetFunction(dosbase, OFF_EXAM, old_exam)
IF iconbase THEN CloseLibrary(iconbase)
IF utilitybase THEN CloseLibrary(utilitybase)
IF whatisbase THEN CloseLibrary(whatisbase)
IF rdargs THEN FreeArgs(rdargs)
ENDPROC
PROC freelist()
DEF n:PTR TO ln
n:=namelist.head
WHILE n.succ
deletenode(n)
n:=n.succ
ENDWHILE
ENDPROC
PROC deletenode(n:PTR TO ln)
DisposeLink(n.name)
Remove(n)
Dispose(n)
ENDPROC
PROC addnode(fib:PTR TO fileinfoblock)
DEF p:PTR TO ln, s, t
t:=StrLen(fib.filename)
s:=String(t+6)
StringF(s, '\s.info', fib.filename)
IF p:=Lock(s, ACCESS_READ)
UnLock(p)
DisposeLink(s)
ELSE
SetStr(s, t)
t:=WhatIs(s, [WI_DEEP, DEEPTYPE, WI_FIB, fib, NIL])
IF CmpFileType(t, icontype)<>CMP_EQUAL
p:=New(SIZEOF ln)
p.type:=t
p.name:=s
IF CmpFileType(t, exetype)<>CMP_EQUAL
IF IsSubTypeOf(t, exetype)=FALSE
fib.protection:=fib.protection OR FIBF_EXECUTE
ENDIF
ENDIF
IF debug AND %01
IF CmpFileType(t, TYPE_UNKNOWNFILETYPE)=CMP_EQUAL
WriteF('Unknown file type for "\s"\n', p.name)
ENDIF
ENDIF
AddHead(namelist, p)
ENDIF
ENDIF
ENDPROC
PROC iswb()
DEF tsk:tc, l:ln
tsk:=FindTask(NIL)
IF tsk
IF l:=tsk.ln
IF l.name
IF StrCmp(l.name, 'Workbench', ALL) THEN RETURN tsk
ENDIF
ENDIF
ENDIF
ENDPROC NIL
PROC do_exnext()
DEF fib, r
MOVE.L D0, r
MOVE.L D2, fib
IF iswb()
IF r=DOSTRUE THEN addnode(fib)
ENDIF
ENDPROC
PROC do_exam()
IF iswb()
freelist()
IF win
/* This is a horrible, horrible hack... */
win.extdata:=CurrentDir(0)
CurrentDir(win.extdata)
win:=NIL
ENDIF
ENDIF
ENDPROC
PROC nextname()
DEF p:PTR TO ln, f:PTR TO ln
p:=namelist.head
f:=p
WHILE p.succ
IF Stricmp(f.name, p.name)>0 THEN f:=p
p:=p.succ
ENDWHILE
RETURN f
ENDPROC
PROC tryfake()
DEF n, i, t, s:PTR TO ln
MOVE.L D1, i
IF iswb() AND StrCmp(i, 'ENV:sys/def_', 12)
s:=nextname()
IF s.succ
t:=GetIconName(s.type)
IF t[]
n:=StrLen(t)
CopyMem(t, i+8, n)
CopyMem('.info', i+8+n, 6)
IF debug AND %10
IF t:=Lock(i, ACCESS_READ)
UnLock(t)
ELSE
WriteF('Couldn''t find icon "\s"\n', i)
ENDIF
ENDIF
ENDIF
deletenode(s)
ENDIF
ENDIF
ENDPROC
PROC do_ow()
DEF w:PTR TO window
MOVE.L D0, w
IF iswb()
win:=w
ENDIF
ENDPROC
PROC do_addglist()
DEF w:PTR TO window, i:PTR TO diskobject, p:PTR TO process, pw,
g:PTR TO gadget, si:PTR TO stringinfo, len, dtl=0, iname
MOVE.L A0, w
MOVE.L A1, g
IF p:=iswb()
IF StrCmp(w.title, 'Execute a File', ALL) AND (w:=w.parent)
IF w.extdata
pw:=p.windowptr
p.windowptr:=-1
WHILE g
IF g.gadgettype AND GTYP_STRGADGET
IF si:=g.specialinfo
/* Make use of the horrible, horrible hack... */
dtl:=CurrentDir(w.extdata)
iname:=GetIconName(WhatIs(si.buffer,[WI_DEEP,DEEPTYPE,NIL]))
CurrentDir(dtl)
IF iname[]
len:=StrLen(si.buffer)
CopyMem(si.buffer, si.undobuffer, len+1)
CopyMem('ENV:sys/', si.buffer, 8)
CopyMem(iname, si.buffer+8, StrLen(iname)+1)
IF i:=GetDiskObject(si.buffer)
dtl:=StrLen(i.defaulttool)
IF dtl
IF InStr(i.defaulttool, ' ', 0)<>NOT_FOUND
PutChar(si.buffer, QUOTE)
CopyMem(i.defaulttool, si.buffer+1, dtl)
CopyMem('" ', si.buffer+dtl+1, 2)
dtl:=dtl+3
ELSE
CopyMem(i.defaulttool, si.buffer, dtl)
PutChar(si.buffer+dtl, " ")
INC dtl
ENDIF
IF iname:=FindToolType(i.tooltypes, 'PRE_ARGS')
CopyMem(iname, si.buffer+dtl, StrLen(iname))
dtl:=dtl+StrLen(iname)
PutChar(si.buffer+dtl, " ")
INC dtl
ENDIF
si.bufferpos:=dtl
CopyMem(si.undobuffer, si.buffer+dtl, len+1)
dtl:=dtl+len
IF iname:=FindToolType(i.tooltypes, 'POST_ARGS')
PutChar(si.buffer+dtl, " ")
INC dtl
CopyMem(iname, si.buffer+dtl, StrLen(iname)+1)
ENDIF
ELSE
CopyMem(si.undobuffer, si.buffer, len+1)
ENDIF
FreeDiskObject(i)
ELSE
CopyMem(si.undobuffer, si.buffer, len+1)
ENDIF
ENDIF
ENDIF
g:=NIL
ENDIF
IF g THEN g:=g.nextgadget
ENDWHILE
p.windowptr:=pw
ENDIF
ENDIF
ENDIF
ENDPROC
/* Place to store A4 register */
store: LONG 0
/* Places to store real library call addresses */
patch_addg: LONG 0
patch_exam: LONG 0
patch_exnext: LONG 0
patch_open: LONG 0
patch_ow: LONG 0
new_addg:
MOVEM.L D0-D7/A0-A6, -(A7)
LEA store(PC), A4
MOVE.L (A4), A4
do_addglist()
MOVEM.L (A7)+, D0-D7/A0-A6
MOVE.L patch_addg(PC), -(A7)
RTS
new_ow:
PEA start_ow(PC)
MOVE.L patch_ow(PC), -(A7)
RTS
start_ow:
MOVEM.L D0-D7/A0-A6, -(A7)
LEA store(PC), A4
MOVE.L (A4), A4
do_ow()
MOVEM.L (A7)+, D0-D7/A0-A6
RTS
new_exam:
MOVEM.L D1-D7/A0-A6, -(A7)
LEA store(PC), A4
MOVE.L (A4), A4
do_exam()
MOVEM.L (A7)+, D1-D7/A0-A6
MOVE.L patch_exam(PC), -(A7)
RTS
new_exnext:
PEA start_exnext(PC)
MOVE.L patch_exnext(PC), -(A7)
RTS
start_exnext:
MOVEM.L D0-D7/A0-A6, -(A7)
LEA store(PC), A4
MOVE.L (A4), A4
do_exnext()
MOVEM.L (A7)+, D0-D7/A0-A6
RTS
new_open:
MOVEM.L D1-D7/A0-A6, -(A7)
LEA store(PC), A4
MOVE.L (A4), A4
tryfake()
MOVEM.L (A7)+, D1-D7/A0-A6
MOVE.L patch_open(PC), -(A7)
RTS